#!/bin/bash

# 这是一个用于更新go-gateworker的脚本
# 它可以编译新版本并执行热重启，无需停机

# 配置
PID_FILE="gateway.pid"
BINARY_NAME="gateworker"
CONFIG_FILE="config.json"

# 打印帮助信息
show_help() {
  echo "使用方法: ./update.sh [选项]"
  echo "选项:"
  echo "  -b, --build     仅构建新的二进制文件"
  echo "  -r, --restart   仅重启已运行的服务"
  echo "  -h, --help      显示帮助信息"
  echo "  无参数          构建并重启服务"
}

# 构建新版本
build_binary() {
  echo "正在构建新版本..."
  
  # 备份旧的二进制文件
  if [ -f "$BINARY_NAME" ]; then
    mv "$BINARY_NAME" "${BINARY_NAME}.bak"
    echo "已备份现有二进制文件为 ${BINARY_NAME}.bak"
  fi
  
  # 编译新版本
  go build -o "$BINARY_NAME"
  
  if [ $? -ne 0 ]; then
    echo "构建失败！"
    # 恢复备份
    if [ -f "${BINARY_NAME}.bak" ]; then
      mv "${BINARY_NAME}.bak" "$BINARY_NAME"
      echo "已恢复备份"
    fi
    exit 1
  fi
  
  echo "新版本已构建完成"
}

# 热重启服务
restart_service() {
  if [ ! -f "$PID_FILE" ]; then
    echo "错误：未找到PID文件 $PID_FILE"
    echo "服务可能未运行"
    exit 1
  fi
  
  PID=$(cat "$PID_FILE")
  
  if ! ps -p "$PID" > /dev/null; then
    echo "错误：PID文件存在但进程 $PID 不存在"
    echo "请先启动服务或删除过时的PID文件"
    exit 1
  fi
  
  echo "正在发送热重启信号到进程 $PID..."
  kill -USR2 "$PID"
  
  if [ $? -ne 0 ]; then
    echo "发送信号失败！"
    exit 1
  fi
  
  echo "热重启信号已发送"
  echo "等待新进程启动..."
  
  # 等待新的PID文件出现或更新
  sleep 5
  
  if [ -f "$PID_FILE" ]; then
    NEW_PID=$(cat "$PID_FILE")
    if [ "$NEW_PID" != "$PID" ]; then
      echo "热重启成功，新进程PID: $NEW_PID"
    else
      echo "热重启可能未成功，请检查日志"
    fi
  else
    echo "热重启后未找到PID文件，请检查日志"
  fi
}

# 处理命令行参数
case "$1" in
  -h|--help)
    show_help
    exit 0
    ;;
  -b|--build)
    build_binary
    exit 0
    ;;
  -r|--restart)
    restart_service
    exit 0
    ;;
  *)
    build_binary
    restart_service
    ;;
esac

exit 0